package com.sc.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.relation.RelationManager;
import com.sc.dto.*;
import com.sc.entity.EmpRole;
import com.sc.entity.Role;
import com.sc.result.Result;
import com.sc.result.ResultCode;
import com.sc.service.EmpRoleService;
import com.sc.service.RoleService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.sc.entity.Emp;
import com.sc.service.EmpService;

import java.io.Serializable;
import java.util.*;

import static com.sc.entity.table.EmpRoleTableDef.EMP_ROLE;

/**
 * 员工表 控制层。
 *
 * @author JoeZhou
 * @since 2024-09-11
 */
@RestController
@RequestMapping("/api/v1/emp")
public class EmpController {

    @Autowired
    private EmpService empService;
    @Autowired
    private EmpRoleService empRoleService;
    @Autowired
    private RoleService roleService;

    @PutMapping("updateMyRoles")
    public boolean updateMyRoles(@RequestBody EmpRoleUpdateDTO dto) {
        return empRoleService.updateEmpRoles(dto);
    }

    /**
     *  根据员工ID查询该员工的全部角色
     * @param eid 员工ID
     * @return
     */
    @GetMapping("listMyRoles/{eid}")
    public List<Role> listMyRoles(@PathVariable(name = "eid") Integer eid) {
        QueryWrapper queryWrapper
                = QueryWrapper.create().select(EMP_ROLE.ROLE_ID).where(EmpRole::getEmpId).eq(eid);
        List<Integer> roleIds = empRoleService.listAs(queryWrapper, Integer.class);
        if (CollUtil.isEmpty(roleIds))
            return Collections.emptyList();
        return roleService.listByIds(roleIds);
    }


    /**
     * 统计在执员工数据
     *
     * @return
     */
    @GetMapping("living")
    public Object livingEmp() {
        return empService.livingEmp();
    }

    /**
     * 添加员工表。
     *
     * @param dto 新增员工dto
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public Object save(@RequestBody EmpInsertDTO dto) {
        Emp emp = BeanUtil.copyProperties(dto, Emp.class);
        return empService.register(emp);
    }

    /**
     * 根据主键删除员工表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    public boolean remove(@PathVariable Serializable id) {
        return empService.removeById(id);
    }

    /**
     * 根据主键批量删除员工表。
     *
     * @param ids 多个主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("batchRemove")
    public boolean batchRemove(@RequestParam String ids) {
        return empService.removeByIds(Arrays.asList(ids.split(",")));
    }

    /**
     * 根据主键更新员工表。
     *
     * @param dto 员工信息
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    public boolean update(@RequestBody EmpUpdateDTO dto) {
        Emp emp = BeanUtil.copyProperties(dto, Emp.class);
        return empService.updateById(emp, true);
    }

    /**
     * 查询所有员工表。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public List<Emp> list() {
        return empService.list();
    }


    /**
     * 查询所有拥有某（几）个角色的。
     *
     * @return 所有数据
     */
    @GetMapping("listByRole")
    public List<Emp> listByRole(@RequestParam String roleIds) {
        QueryWrapper queryWrapper = QueryWrapper.create()
                .select("emp_id")
                .in("role_id", roleIds.split(","));
        List<Long> empIds = empRoleService.listAs(queryWrapper, Long.class);
        queryWrapper.clear();
        queryWrapper.in("id", empIds);
        return empService.list(queryWrapper);
    }

    /**
     * 根据员工表主键获取详细信息。
     *
     * @param id 员工表主键
     * @return 员工表详情
     */
    @GetMapping("getInfo/{id}")
    public Emp getInfo(@PathVariable Serializable id) {
        return empService.getById(id);
    }

    /**
     * 做分页查询：可以根据部门查，根据姓名模糊查找，根据电话号查找
     * @return
     */
    @PostMapping("page")
    public Page<Emp> page(@RequestBody EmpPageDTO dto) {
        Page<Emp> page = new Page<>(dto.getPageNum(), dto.getPageSize());
        RelationManager.addIgnoreRelations("roles");
        QueryWrapper queryWrapper = new QueryWrapper();
        if (dto.getName() != null) {
            queryWrapper.like("name", dto.getName());
        }
        if (dto.getPhone() != null) {
            queryWrapper.eq("phone", dto.getPhone());
        }
        if (dto.getDeptId() != null) {
            queryWrapper.eq("dept_id", dto.getDeptId());
        }
        return empService.pageAs(page, queryWrapper, Emp.class);
    }

    /**
     * 员工修改自己的密码，需要填写手机号、旧密码和新密码
     * @param dto
     * @return
     */
    @PostMapping("modifyPasswd")
    public Object modifyPasswd(@RequestBody ModifyPasswdDTO dto) {
        return empService.modifyPasswd(dto);
    }

    /**
     * 当员工忘记自己密码时，用于管理员重置员工密码，需要填写手机号，密码将重置为手机号码后6位
     * @param eid 员工ID
     * @return
     */
    @PostMapping("resetPasswd/{eid}")
    public Object resetPasswd(@PathVariable Long eid) {
        return empService.resetPasswd(eid);
    }

    @GetMapping("getName/{eid}")
    public Result<String> getName(@PathVariable Long eid) {
        QueryWrapper queryWrapper = QueryWrapper.create().select("name").eq("id", eid);
        String name = empService.getOneAs(queryWrapper, String.class);
        return new Result<>(ResultCode.SUCCESS, name);
    }
}
